package cn.tannn.tgateway;

import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 网关插件 - gateway plugin
 *
 * @author <a href="https://t.tannn.cn/">tan</a>
 * @date 2024/5/30 下午3:50
 */
public interface GatewayPlugin {

    /**
     * plugin request prefix
     */
    String GATEWAY_PREFIX = "/gw";


    /**
     * 启动
     */
    void start();

    /**
     * 停止
     */
    void stop();

    /**
     * @return 插件名
     */
    String getName();


    /**
     * 是否支持当前 server web Internal 的处理，避免 plugin 处理了不该自己处理的请求
     *
     * @param exchange {@link ServerWebExchange}
     * @return false 不支持
     */
    boolean support(ServerWebExchange exchange);

    /**
     * 具体的处理
     * @param exchange  {@link ServerWebExchange}
     * @param chain {@link GatewayPluginChain}
     * @return  {@link Mono}
     */
    Mono<Void> handle(ServerWebExchange exchange, GatewayPluginChain chain);
}
